﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.IO.Ports;

namespace Vtron.ATSP.Infrastructure
{
    /// <summary>
    /// 公用的静态参数及方法
    /// </summary>
    /// <remarks>
    ///     <创建人>邓穗捷</创建人>
    ///     <创建时间>2014-08-14</创建时间>
    ///     <修订人></修订人>
    ///     <修订时间></修订时间>
    ///     <修订说明></修订说明>
    /// </remarks>
    public static class Utils
    {
        /// <summary>
        /// 投影机的IP
        /// </summary>
        public static string ProjectorIP = String.Empty;

        /// <summary>
        /// 投影机的端口号
        ///     5001 是投影机通信的业务端口号
        /// </summary>
        public static readonly int ProjectorPort = 5001;

        /// <summary>
        /// 测试仪的端口名称
        /// </summary>
        public static string TesterPortName = String.Empty;

        /// <summary>
        /// 测试仪的波特率
        /// </summary>
        public static int TesterBaudRate = 0;

        /// <summary>
        /// 测试仪的奇偶校验值
        /// </summary>
        public static readonly Parity TesterParity = Parity.None;

        /// <summary>
        /// 测试仪的停止位数
        /// </summary>
        public static readonly StopBits TesterStopBits = StopBits.One;

        /// <summary>
        /// 测试仪的标准数据位长度
        /// </summary>
        public static readonly int TesterDataBits = 8;

        /// <summary>
        /// 测试仪的访问超时时间（毫秒）
        /// </summary>
        public static readonly int TesterReadTimeout = 1000;

        /// <summary>
        /// 将对象转换为字节数组
        /// </summary>
        /// <param name="obj">对象</param>
        /// <returns>字节数组</returns>
        /// <remarks>
        ///     <创建人>邓穗捷</创建人>
        ///     <创建时间>2014-08-14</创建时间>
        ///     <修订人></修订人>
        ///     <修订时间></修订时间>
        ///     <修订说明></修订说明>
        /// </remarks>
        public static byte[] ObjectToBytes(object obj)
        {
            int size = Marshal.SizeOf(obj);
            byte[] bytes = new byte[size];
            IntPtr structPtr = Marshal.AllocHGlobal(size);
            Marshal.StructureToPtr(obj, structPtr, false);
            Marshal.Copy(structPtr, bytes, 0, size);
            Marshal.FreeHGlobal(structPtr);
            return bytes;
        }

        /// <summary>
        /// byte数组转对象
        /// </summary>
        /// <param name="bytes">byte数组</param>
        /// <param name="type">对象类型</param>
        /// <returns>转换后的对象</returns>
        /// <remarks>
        ///     <创建人>邓穗捷</创建人>
        ///     <创建时间>2014-08-14</创建时间>
        ///     <修订人></修订人>
        ///     <修订时间></修订时间>
        ///     <修订说明></修订说明>
        /// </remarks>
        public static object BytesToObject(byte[] bytes, Type type)
        {
            int size = Marshal.SizeOf(type);
            if (size > bytes.Length)
            {
                bytes = bytes.Concat(new byte[size - bytes.Count()]).ToArray();
            }
            else if (size < bytes.Length)
            {
                byte[] sizes = new byte[size];
                for (int i = 0; i < size; i++)
                {
                    sizes[i] = bytes[i];
                }
                bytes = sizes;
            }
            IntPtr structPtr = Marshal.AllocHGlobal(size);
            Marshal.Copy(bytes, 0, structPtr, bytes.Count());
            object obj = Marshal.PtrToStructure(structPtr, type);
            Marshal.FreeHGlobal(structPtr);
            return obj;
        }
    }
}
